﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
using kinokasse.bauteile.contracts.SaalplanView;
using kinokasse.datamodel.contracts;

namespace kinokasse.saalplanview
{
    public partial class SaalplanView : UserControl, ISaalplanView
    {
        private Saalplan saalplan;
        private int anzahlSitzSpalten;
        private int anzahlSitzZeilen;
        private readonly Dictionary<CheckBox, Sitz> sitzControls = new Dictionary<CheckBox, Sitz>();

        public SaalplanView() {
            InitializeComponent();
        }

        public void In_Anzeigen(Saalplan saalplan) {
            Trace.TraceInformation("Saalplan anzeigen: {0} Sitze", saalplan.Sitze.Count());

            this.saalplan = saalplan;
            SitzControls_zerstören();
            Sitzmatrixdimensionen_berechnen();
            Sitzmatrix_im_Grid_spaltenweise_anzeigen();
        }

        public void In_SitzeGewählt(IEnumerable<Sitz> sitze) {
            Trace.WriteLine(string.Format("In_SitzeGewählt({0} sitze)", sitze.Count()));
            foreach (var kvp in sitzControls) {
                kvp.Key.Checked = sitze.Contains(kvp.Value);
            }
        }

        public void In_AktuelleBuchungen(IEnumerable<Buchung> buchungen) {
            Trace.WriteLine(string.Format("In_AktuelleBuchungen({0} sitze)", buchungen.Count()));
            foreach (var kvp in sitzControls) {
                var keyValuePair = kvp;
                kvp.Key.Enabled = !buchungen.Any(buchung => 
                    buchung.Reihe == keyValuePair.Value.Reihe &&
                    buchung.SitzNummer == keyValuePair.Value.Nummer);
            }
        }

        private void Sitzmatrixdimensionen_berechnen() {
            var maxSitzSpalte = saalplan.Sitze.Max(sitz => sitz.Position.Y);
            var minSitzSpalte = saalplan.Sitze.Min(sitz => sitz.Position.Y);
            var maxSitzZeile = saalplan.Sitze.Max(sitz => sitz.Position.X);
            var minSitzZeile = saalplan.Sitze.Min(sitz => sitz.Position.X);
            anzahlSitzSpalten = maxSitzSpalte - minSitzSpalte + 1;
            anzahlSitzZeilen = maxSitzZeile - minSitzZeile + 1;
        }

        private void Sitzcontrol_Click(object sender, EventArgs e) {
            var sitz = GetSitz((CheckBox)sender);
            Trace.WriteLine(string.Format("Out_SitzGewählt({0})", sitz));
            Out_SitzGewählt(sitz);
        }

        private Sitz GetSitz(CheckBox sitzControl) {
            return sitzControls[sitzControl];
        }

        public event Action<Sitz> Out_SitzGewählt;
    }
}